#include "Thread.hpp"
#include <unordered_map>
#include <memory>
#define NUM 10

class threaddata
{
public:
    int max;
    int start;
};

void Count(threaddata td)
{
    for(int i = td.start; i < td.max; i++)
    {
        std::cout << "i== " << i << std::endl;
        sleep(1);
    }
}
// using thread_ptr_t = std::shared_ptr<ThreadModule::Thread>;

int main()
{

    //含参（多参）
    threaddata td;
    td.max = 60;
    td.start = 50;
    ThreadModule::Thread<threaddata> t(Count,td);
    t.Start();
    sleep(5);

    t.Join();
///////////////////////////////////////////////////////////////////////////////////////////////////

    // //含参（单参）
    // ThreadModule::Thread<int> t(Count,10);
    // t.Start();
    // sleep(5);

    // t.Join();

///////////////////////////////////////////////////////////////////////////////////////////////////

    //创建多线程？
    //用unordered_map保存多线程信息，参数为线程名称和该线程的指针（智能指针）
    // std::unordered_map<std::string , thread_ptr_t> threads;
    // for(int i = 0; i < NUM; i++)
    // {
    //     thread_ptr_t t = std::make_shared<ThreadModule::Thread>([](){
    //         while(true)
    //     {
    //         std::cout << "hello,i am lambda!" << std::endl;
    //         sleep(1);
    //     }
    //     });
    //     threads[t->GetName()] = t;
    // }
    // //启动
    // for(auto &thread:threads)
    // {
    //     thread.second->Start();
    // }
    // //等待
    // for(auto &thread:threads)
    // {
    //     thread.second->Join();
    // }

////////////////////////////////////////////////////////////////////////////////////////////////////

    //单线程
    // ThreadModule::Thread t([](){
    //     while(true)
    //     {
    //         std::cout << "hello,i am lambda!" << std::endl;
    //         sleep(1);
    //     }
    // });
    // t.Start();
    // std::cout << t.GetName() << "is Running" << std::endl;
    // sleep(5);

    // t.Stop();
    // std::cout<<"stop thread : "<< t.GetName() << std::endl;
    // sleep(1);
    // t.Join();

    // std::cout<<"join thread : "<< t.GetName() << std::endl;

    return 0;
}